昨天我們把資料都處理好了,現在我們終於進行可以最後的步驟,也就是程式編譯,要怎麼直接讓合約偵測使用者的錢包呢?我們就一起看下去吧!
到最熟悉的Openzeppelin
點選似曾相識的Wizard
,不過特別注意的是,不用勾選URI Storage
,因為我們不用上鏈之後編輯。
讓我們回到Remix編譯
uint256 MAX_SUPPLY = 10;
這邊我們一樣新增最大供給量
string baseURI = "ipfs://QmSFFACYLvFBML6TLQCPPU947SQgjetFLz6g1oTqfeamCV/";
往下我們再新增URI,需要到Pinata那邊複製
而這邊要特別注意的是需要填入ipfs://...../
最後需要再一條斜線
因為我們上傳的是資料夾,而token ID是從0開始計算的,所以在後面需要多一條斜線
範例:
function safeMint() public {
uint256 tokenId = _tokenIdCounter.current();
require (tokenId < MAX_SUPPLY, "All NFT have been minted.");
string memory uri = string(abi.encodePacked(baseURI,Strings.toString(tokenId)));
_tokenIdCounter.increment();
_safeMint(msg.sender, tokenId);
_setTokenURI(tokenId, uri);
}
這邊msg.sender可以自動連接使用者錢包,不需要再輸入地址
一樣編譯+上鏈
之後點選SafeMint連接錢包,就可以了
當成功之後就可以在Opensea testnet上看到你心愛的NFT了!
這是連續10次mint的結果
到這邊你已經可以自己發行你的NFT了,恭喜各位,明天我們再來研究看看還有沒有地方可以再改進的吧!
明天可以試試看如何去限制一個人可以mint的數量。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract MyToken is ERC721, ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
uint256 MAX_SUPPLY = 10;
string baseURI = "ipfs://CID/";
string public baseExtension = ".json";
constructor() ERC721("I'mma Man NFT", "IMMN") {}
function safeMint() public {
uint256 tokenId = _tokenIdCounter.current();
require (tokenId < MAX_SUPPLY, "All NFT have been minted.");
string memory uri = string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension));
_tokenIdCounter.increment();
_safeMint(msg.sender, tokenId);
_setTokenURI(tokenId, uri);
}
// The following functions are overrides required by Solidity.
function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
super._burn(tokenId);
}
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
}